package org.dromara.common.core.service

import org.dromara.common.core.domain.dto.CompleteTaskDTO
import org.dromara.common.core.domain.dto.StartProcessDTO
import org.dromara.common.core.domain.dto.StartProcessReturnDTO

/**
 * 通用 工作流服务
 *
 * @author may
 * @updater LikeYouDo
 * @date 2025/1/13 14:10
 */
interface WorkflowService {

    /**
     * 运行中的实例 删除程实例，删除历史记录，删除业务与流程关联信息
     *
     * @param businessIds 业务id
     * @return 结果
     */
    fun deleteInstance(businessIds: List<Long>?): Boolean

    /**
     * 获取当前流程状态
     *
     * @param taskId 任务id
     * @return 状态
     */
    fun getBusinessStatusByTaskId(taskId: Long?): String?

    /**
     * 获取当前流程状态
     *
     * @param businessId 业务id
     * @return 状态
     */
    fun getBusinessStatus(businessId: String?): String?

    /**
     * 设置流程变量
     *
     * @param instanceId 流程实例id
     * @param variable   流程变量
     */
    fun setVariable(instanceId: Long?, variables: Map<String, Any?>?)

    /**
     * 获取流程变量
     *
     * @param instanceId 流程实例id
     */
    fun instanceVariable(instanceId: Long?): Map<String, Any?>?

    /**
     * 按照业务id查询流程实例id
     *
     * @param businessId 业务id
     * @return 结果
     */
    fun getInstanceIdByBusinessId(businessId: String?): Long?

    /**
     * 新增租户流程定义
     *
     * @param tenantId 租户id
     */
    fun syncDef(tenantId: String?)

    /**
     * 启动流程
     *
     * @param startProcess 参数
     * @return 结果
     */
    fun startWorkFlow(startProcess: StartProcessDTO?): StartProcessReturnDTO?

    /**
     * 办理任务
     * 系统后台发起审批 无用户信息 需要忽略权限
     * completeTask.getVariables().put("ignore", true);
     *
     * @param completeTask 参数
     * @return 结果
     */
    fun completeTask(completeTask: CompleteTaskDTO?): Boolean

    /**
     * 办理任务
     *
     * @param taskId  任务ID
     * @param message 办理意见
     * @return 结果
     */
    fun completeTask(taskId: Long?, message: String?): Boolean

    /**
     * 启动流程并办理第一个任务
     *
     * @param startProcess 参数
     * @return 结果
     */
    fun startCompleteTask(startProcess: StartProcessDTO): Boolean
}
